Readme
A base de dados de ocorrências aeronáuticas está disponibilizada no Portal Brasileiro de Dados Abertos e contém informações sobre as Ocorrências Aeronáuticas da Aviação Civil Brasileira nos últimos 10 anos.
Autores: Breno Cabral e Pedro Reis
Os dados estão distribuídos em 4 (quatro) tabelas diferentes, que estão vinculadas por um mesmo código de ocorrência presente na primeira coluna. Os principais conteúdos disponíveis em cada uma delas está representado abaixo:
Tabela de ocorrências: Classificação, tipo de ocorrência, latitude, longitude, cidade, UF, dia, horário, número de aeronaves envolvidas.
Tabela de fatores contribuintes: nome, aspecto, condicionante, area, detalhe do fator contribuinte.
Tabela de aeronaves: Categoria do operador, tipo de aeronave, modelo, tipo do motor, quantidade de motores, fabricante, país fabricante, ano de fabricação, nível de dano e número de fatalidades.
Tabela de recomendações de segurança: Número de recomendação, datas, status da recomendação e destinatário.
A partir dos dados presentes nas tabelas é possível realizar algumas análises como:
- Os 5 Fabricantes responsáveis por aeronaves com maior número de acidentes;
- Relação entre as ocorrências (acidente, incidente e incidente grave) com o ano da ocorrência;
- Estado com maior número de ocorrências, quais operações estavam ocorrendo nos acidentes e comparar o número de acidentes de avião e helicóptero por ano;
- Identificar os principais fatores que contribuíram para as ocorrências com fatalidade.
Fonte dos dados: http://dados.gov.br/dataset/ocorrencias-aeronauticas-da-aviacao-civil-brasileira
Data da consulta: 30/01/2019
Projeto
1. Coleta e preparação dos dados
Primeiramente, serão instalados e expostos todos os pacotes utilizados no desenvolvimento do projeto.
# Instalando pacotes necessários
if(!require(prettydoc)){
install.packages("prettydoc", dep = TRUE)
library(prettydoc)
}
if(!require(tidyverse)){
install.packages("tidyverse", dep = TRUE)
library(tidyverse)
}
if(!require(stringr)){
install.packages("stringr", dep = TRUE)
library(stringr)
}
if(!require(magrittr)){
install.packages("magrittr", dep = TRUE)
library(magrittr)
}
if(!require(rvest)){
install.packages("rvest", dep = TRUE)
library(rvest)
}
if(!require(mlbench)){
install.packages("mlbench", dep = TRUE)
library(mlbench)
}
if(!require(ggplot2)){
install.packages("ggplot2", dep = TRUE)
library(ggplot2)
}
# Pacotes envolvendo o desenvolvimento do mapa interativo
if(!require(rgdal)){
install.packages("rgdal", dep = TRUE)
library(rgdal)
}
if(!require(RColorBrewer)){
install.packages("RColorBrewer", dep = TRUE)
library(RColorBrewer)
}
if(!require(leaflet)){
install.packages("leaflet", dep = TRUE)
library(leaflet)
}
if(!require(leaflet)){
install.packages("leaflet", dep = TRUE)
library(leaflet)
}
# Pacotes para o modelo de regressão
if(!require(corrgram)){
install.packages("corrgram", dep = TRUE)
library(corrgram)
}
if(!require(broom)){
install.packages("broom", dep = TRUE)
library(broom)
}
if(!require(plotly)){
install.packages("plotly", dep = TRUE)
library(plotly)
}
if(!require(skimr)){
install.packages("skimr", dep = TRUE)
library(skimr)
}
if(!require(caTools)){
install.packages("caTools", dep = TRUE)
library(caTools)
}Nesta etapa, cada url está nomeado com o nome da tabela correspondente a ele, conforme nomenclatura na descrição do projeto. Com excessão de “fatores contribuintes” que virou “contribuintes” e “recomendações de segurança” que virou “recomendacoes”.
# Criando variaveis com as fontes dos dados de cada tabela
url_ocorrencias <- "https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/oco.csv"
url_aeronaves <- "https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/anv.csv"
url_contribuintes <- "https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv"
url_recomendacoes <- "https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv"Nesta etapa, os dataframes foram criados e os campos sem valores, que estavam representados por diversos símbolos, foram identificados para serem substituídos por “NA”.
# Criando dataframes
df_ocorrencias <- read_delim(url_ocorrencias, delim = "~", col_names = TRUE, na = c("","NULL","***","****","*****","###!","####"))## Parsed with column specification:
## cols(
## .default = col_character(),
## codigo_ocorrencia = col_double(),
## ocorrencia_latitude = col_double(),
## ocorrencia_longitude = col_double(),
## ocorrencia_dia = col_date(format = ""),
## ocorrencia_horario = col_time(format = ""),
## divulgacao_dia_publicacao = col_date(format = ""),
## total_recomendacoes = col_double(),
## total_aeronaves_envolvidas = col_double(),
## ocorrencia_dia_extracao = col_date(format = "")
## )
## See spec(...) for full column specifications.
df_aeronaves <- read_delim(url_aeronaves, delim = "~", col_names = TRUE, na = c("","NULL","***","****","*****","###!","####"))## Parsed with column specification:
## cols(
## .default = col_character(),
## codigo_ocorrencia = col_double(),
## aeronave_pmd = col_double(),
## aeronave_assentos = col_double(),
## aeronave_ano_fabricacao = col_double(),
## total_fatalidades = col_double(),
## aeronave_dia_extracao = col_date(format = "")
## )
## See spec(...) for full column specifications.
df_contribuintes <- read_delim(url_contribuintes, delim = "~", col_names = TRUE, na = c("","NULL","***","****","*****","###!","####"))## Parsed with column specification:
## cols(
## codigo_ocorrencia = col_double(),
## fator_nome = col_character(),
## fator_aspecto = col_character(),
## fator_condicionante = col_character(),
## fator_area = col_character(),
## fator_detalhe_fator = col_character(),
## fator_dia_extracao = col_date(format = "")
## )
## Warning: 2 parsing failures.
## row col expected actual file
## 3362 fator_detalhe_fator delimiter or quote G 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv'
## 3362 fator_detalhe_fator delimiter or quote ) 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv'
df_recomendacoes <- read_delim(url_recomendacoes, delim = "~", col_names = TRUE, na = c("","NULL","***","****","*****","###!","####"))## Parsed with column specification:
## cols(
## codigo_ocorrencia = col_double(),
## recomendacao_numero = col_character(),
## recomendacao_dia_assinatura = col_date(format = ""),
## recomendacao_dia_encaminhamento = col_date(format = ""),
## recomendacao_feedback = col_date(format = ""),
## recomendacao_conteudo = col_character(),
## recomendacao_status = col_character(),
## recomendacao_destinatario_sigla = col_character(),
## recomendacao_destinatario_nome = col_character(),
## dia_extracao_recomendacao = col_date(format = "")
## )
## Warning: 93 parsing failures.
## row col expected actual file
## 224 recomendacao_conteudo delimiter or quote C 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'
## 224 recomendacao_conteudo delimiter or quote * 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'
## 224 NA 10 columns 9 columns 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'
## 592 recomendacao_conteudo delimiter or quote D 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'
## 592 recomendacao_conteudo delimiter or quote * 'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'
## ... ..................... .................. ......... .....................................................................................
## See problems(...) for more details.
2. Tratamento dos data frames
Modificações nos data frames df_ocorrencias, df_aeronaves e df_contribuintes - Colunas que apresentam categorias e são passíveis de futuras análises foram transformadas em fatores; - A coluna “codigo_ocorrencia” foi modificada para character pois ela é a coluna comum entre as tabelas e será utilizada para juntá-las mais a frente; - Colunas que não foram identificadas como úteis para as análises futuras foram removidas; - Os 3 dataframes serão utilizados no projeto.
Modificações no data frame df_recomendacoes - Foi concluído que não será necessário a utilização do dataframe de recomendações para as análises que serão desenvolvidas no projeto.
str(df_ocorrencias)## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 5396 obs. of 22 variables:
## $ codigo_ocorrencia : num 2.01e+14 2.02e+14 2.02e+14 2.01e+14 2.01e+14 ...
## $ ocorrencia_classificacao : chr "ACIDENTE" "INCIDENTE" "INCIDENTE GRAVE" "INCIDENTE GRAVE" ...
## $ ocorrencia_tipo : chr "FALHA DO MOTOR EM VOO" "AERÓDROMO" "COLISÃO COM OBSTÁCULO DURANTE A DECOLAGEM E POUSO" "POUSO SEM TREM" ...
## $ ocorrencia_tipo_categoria : chr "FALHA OU MAU FUNCIONAMENTO DO MOTOR" "AERÓDROMO" "COLISÃO COM OBSTÁCULO DURANTE A DECOLAGEM E POUSO" "CONTATO ANORMAL COM A PISTA" ...
## $ ocorrencia_tipo_icao : chr "SCF-PP" "ADRM" "CTOL" "ARC" ...
## $ ocorrencia_latitude : num -9.91 -11.5 -11.26 -11.5 -13.2 ...
## $ ocorrencia_longitude : num -63 -61.5 -61.3 -61.5 -60.8 ...
## $ ocorrencia_cidade : chr "ARIQUEMES" "CACOAL" "CACOAL" "CACOAL" ...
## $ ocorrencia_uf : chr "RO" "RO" "RO" "RO" ...
## $ ocorrencia_pais : chr "BRASIL" "BRASIL" "BRASIL" "BRASIL" ...
## $ ocorrencia_aerodromo : chr "SJOG" "SSKW" "SSKW" "SSKW" ...
## $ ocorrencia_dia : Date, format: "2013-05-05" "2018-03-09" ...
## $ ocorrencia_horario : 'hms' num 11:00:00 22:40:00 19:19:00 12:32:00 ...
## ..- attr(*, "units")= chr "secs"
## $ investigacao_aeronave_liberada: chr NA "SIM" "SIM" NA ...
## $ investigacao_status : chr "FINALIZADA" "FINALIZADA" "FINALIZADA" "FINALIZADA" ...
## $ divulgacao_relatorio_numero : chr NA NA "IG-084/CENIPA/2016" "IG-209/CENIPA/2013" ...
## $ divulgacao_relatorio_publicado: chr "NÃO" "NÃO" "SIM" "SIM" ...
## $ divulgacao_dia_publicacao : Date, format: NA NA ...
## $ total_recomendacoes : num 0 0 7 0 0 0 0 2 4 0 ...
## $ total_aeronaves_envolvidas : num 1 1 1 1 1 1 2 1 1 1 ...
## $ ocorrencia_saida_pista : chr "NÃO" "NÃO" "NÃO" "NÃO" ...
## $ ocorrencia_dia_extracao : Date, format: "2019-04-22" "2019-04-22" ...
## - attr(*, "spec")=
## .. cols(
## .. codigo_ocorrencia = col_double(),
## .. ocorrencia_classificacao = col_character(),
## .. ocorrencia_tipo = col_character(),
## .. ocorrencia_tipo_categoria = col_character(),
## .. ocorrencia_tipo_icao = col_character(),
## .. ocorrencia_latitude = col_double(),
## .. ocorrencia_longitude = col_double(),
## .. ocorrencia_cidade = col_character(),
## .. ocorrencia_uf = col_character(),
## .. ocorrencia_pais = col_character(),
## .. ocorrencia_aerodromo = col_character(),
## .. ocorrencia_dia = col_date(format = ""),
## .. ocorrencia_horario = col_time(format = ""),
## .. investigacao_aeronave_liberada = col_character(),
## .. investigacao_status = col_character(),
## .. divulgacao_relatorio_numero = col_character(),
## .. divulgacao_relatorio_publicado = col_character(),
## .. divulgacao_dia_publicacao = col_date(format = ""),
## .. total_recomendacoes = col_double(),
## .. total_aeronaves_envolvidas = col_double(),
## .. ocorrencia_saida_pista = col_character(),
## .. ocorrencia_dia_extracao = col_date(format = "")
## .. )
tbl_df(df_ocorrencias)#Transformando algumas colunas para fatores
df_ocorrencias$codigo_ocorrencia %<>% as.character()
df_ocorrencias$ocorrencia_classificacao %<>% as.factor()
df_ocorrencias$ocorrencia_tipo %<>% as.factor()
df_ocorrencias$ocorrencia_tipo_categoria %<>% as.factor()
df_ocorrencias$ocorrencia_saida_pista %<>% as.factor()
df_ocorrencias$ocorrencia_tipo_icao %<>% as.factor()
df_ocorrencias$ocorrencia_cidade %<>% as.factor()
df_ocorrencias$ocorrencia_uf %<>% as.factor()
df_ocorrencias$ocorrencia_aerodromo %<>% as.factor()
#Retirando colunas que a princípio não serão utilizadas
df_ocorrencias$ocorrencia_dia_extracao <- NULL
df_ocorrencias$ocorrencia_pais <- NULL #todas ocorrências são no Brasil
df_ocorrencias$investigacao_aeronave_liberada <- NULL
df_ocorrencias$investigacao_status <- NULL
df_ocorrencias$divulgacao_relatorio_publicado <- NULL
df_ocorrencias$divulgacao_dia_publicacao <- NULL
df_ocorrencias$divulgacao_relatorio_numero <- NULL
#Adicionar coluna ocorrencia_ano e transformar para fator
df_ocorrencias %<>% tidyr::extract(ocorrencia_dia, into = "ocorrencia_ano", regex = "([0-9]{4})", remove = FALSE)str(df_aeronaves)## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 5457 obs. of 25 variables:
## $ codigo_ocorrencia : num 2.01e+14 2.01e+14 2.01e+14 2.02e+14 2.02e+14 ...
## $ aeronave_matricula : chr "PPGXE" "PTRBN" "PTKUK" "PTKUK" ...
## $ aeronave_operador_categoria: chr "AEROCLUBE" "OPERADOR DE AERONAVE" "OPERADOR DE AERONAVE" "OPERADOR PARTICULAR" ...
## $ aeronave_tipo_veiculo : chr "AVIÃO" "AVIÃO" "AVIÃO" "AVIÃO" ...
## $ aeronave_fabricante : chr "NEIVA INDUSTRIA AERONAUTICA" "EMBRAER" "TWIN COMMANDER" "TWIN COMMANDER" ...
## $ aeronave_modelo : chr "56-C" "EMB-810C" "500-B" "500-B" ...
## $ aeronave_tipo_icao : chr "PAUL" "PA34" "AC50" "AC50" ...
## $ aeronave_motor_tipo : chr "PISTÃO" "PISTÃO" "PISTÃO" "PISTÃO" ...
## $ aeronave_motor_quantidade : chr "MONOMOTOR" "BIMOTOR" "BIMOTOR" "BIMOTOR" ...
## $ aeronave_pmd : num 660 2073 3062 3062 660 ...
## $ aeronave_pmd_categoria : chr "ATÉ 2250 KG" "ATÉ 2250 KG" "ENTRE 2250 E 5700 KG" "ENTRE 2250 E 5700 KG" ...
## $ aeronave_assentos : num 2 6 7 7 2 2 2 2 6 6 ...
## $ aeronave_ano_fabricacao : num 1962 1980 1961 1961 1960 ...
## $ aeronave_pais_fabricante : chr "BRASIL" "BRASIL" "ESTADOS UNIDOS" "ESTADOS UNIDOS" ...
## $ aeronave_pais_registro : chr "BRASIL" "BRASIL" "BRASIL" "BRASIL" ...
## $ aeronave_registro_categoria: chr "PRI" "TPX" "TPX" "SAE" ...
## $ aeronave_registro_segmento : chr "INSTRUÇÃO" "TÁXI AÉREO" "TÁXI AÉREO" "ESPECIALIZADA" ...
## $ aeronave_voo_origem : chr "SDPW" NA NA "SBCP" ...
## $ aeronave_voo_destino : chr "SDPW" NA NA "SBCP" ...
## $ aeronave_fase_operacao : chr "INDETERMINADA" "APROXIMAÇÃO FINAL" "CORRIDA APÓS POUSO" "CRUZEIRO" ...
## $ aeronave_fase_operacao_icao: chr "UNKNOWN" "APPROACH" "LANDING" "EN ROUTE" ...
## $ aeronave_tipo_operacao : chr "VOO DE INSTRUÇÃO" "TÁXI AÉREO" "TÁXI AÉREO" "OPERAÇÃO ESPECIALIZADA" ...
## $ aeronave_nivel_dano : chr "SUBSTANCIAL" "NENHUM" "LEVE" "LEVE" ...
## $ total_fatalidades : num 0 0 0 0 0 0 0 0 0 0 ...
## $ aeronave_dia_extracao : Date, format: "2019-04-22" "2019-04-22" ...
## - attr(*, "spec")=
## .. cols(
## .. codigo_ocorrencia = col_double(),
## .. aeronave_matricula = col_character(),
## .. aeronave_operador_categoria = col_character(),
## .. aeronave_tipo_veiculo = col_character(),
## .. aeronave_fabricante = col_character(),
## .. aeronave_modelo = col_character(),
## .. aeronave_tipo_icao = col_character(),
## .. aeronave_motor_tipo = col_character(),
## .. aeronave_motor_quantidade = col_character(),
## .. aeronave_pmd = col_double(),
## .. aeronave_pmd_categoria = col_character(),
## .. aeronave_assentos = col_double(),
## .. aeronave_ano_fabricacao = col_double(),
## .. aeronave_pais_fabricante = col_character(),
## .. aeronave_pais_registro = col_character(),
## .. aeronave_registro_categoria = col_character(),
## .. aeronave_registro_segmento = col_character(),
## .. aeronave_voo_origem = col_character(),
## .. aeronave_voo_destino = col_character(),
## .. aeronave_fase_operacao = col_character(),
## .. aeronave_fase_operacao_icao = col_character(),
## .. aeronave_tipo_operacao = col_character(),
## .. aeronave_nivel_dano = col_character(),
## .. total_fatalidades = col_double(),
## .. aeronave_dia_extracao = col_date(format = "")
## .. )
tbl_df(df_aeronaves)#Transformando algumas colunas para fatores
df_aeronaves$codigo_ocorrencia %<>% as.character()
df_aeronaves$aeronave_operador_categoria %<>% as.factor()
df_aeronaves$aeronave_tipo_veiculo %<>% as.factor()
df_aeronaves$aeronave_fabricante %<>% as.factor()
df_aeronaves$aeronave_modelo %<>% as.factor()
df_aeronaves$aeronave_tipo_icao %<>% as.factor()
df_aeronaves$aeronave_motor_tipo %<>% as.factor()
df_aeronaves$aeronave_motor_quantidade %<>% as.factor()
df_aeronaves$aeronave_pmd %<>% as.numeric()
df_aeronaves$aeronave_pmd_categoria %<>% as.factor()
df_aeronaves$aeronave_registro_segmento %<>% as.factor()
df_aeronaves$aeronave_tipo_operacao %<>% as.factor()
df_aeronaves$aeronave_nivel_dano %<>% as.factor()
df_aeronaves$aeronave_ano_fabricacao %<>% as.factor()
df_aeronaves$aeronave_pais_fabricante %<>% as.factor()
df_aeronaves$aeronave_fase_operacao %<>% as.factor()
#Retirando colunas que a princípio não serão utilizadas
df_aeronaves$aeronave_matricula <- NULL
df_aeronaves$aeronave_registro_categoria <- NULL
df_aeronaves$aeronave_voo_origem <- NULL #excesso de NA
df_aeronaves$aeronave_voo_destino <- NULL #excesso de NA
df_aeronaves$aeronave_fase_operacao_icao <- NULL #excesso de NA
df_aeronaves$aeronave_dia_extracao <- NULLstr(df_contribuintes)## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 4536 obs. of 7 variables:
## $ codigo_ocorrencia : num 2.01e+14 2.01e+14 2.01e+14 2.01e+14 2.01e+14 ...
## $ fator_nome : chr "JULGAMENTO DE PILOTAGEM" "MANUTENÇÃO DE AERONAVE" "SUPERVISÃO GERENCIAL" "ATITUDE" ...
## $ fator_aspecto : chr "DESEMPENHO DO SER HUMANO" "DESEMPENHO DO SER HUMANO" "DESEMPENHO DO SER HUMANO" "ASPECTO PSICOLÓGICO" ...
## $ fator_condicionante: chr "OPERAÇÃO DA AERONAVE" "MANUTENÇÃO DA AERONAVE" "OPERAÇÃO DA AERONAVE" "INDIVIDUAL" ...
## $ fator_area : chr "FATOR OPERACIONAL" "FATOR OPERACIONAL" "FATOR OPERACIONAL" "FATOR HUMANO" ...
## $ fator_detalhe_fator: chr "A PROVÁVEL INTENÇÃO EM PRESERVAR A AERONAVE, CONTROLADAS AS CONDIÇÕES DE APROXIMAÇÃO E LEVANDO EM CONSIDERAÇÃO "| __truncated__ "O RELATÓRIO TÉCNICO DO IAE REVELOU FALHAS ORIUNDAS DE PROCESSOS DE FADIGA E PITES DE CORROSÃO EM DETERMINADOS C"| __truncated__ "O OPERADOR NÃO PROGRAMOU A REALIZAÇÃO DE INSPEÇÕES MAIS CRITERIOSAS NOS ITENS CRÍTICOS DO MOTOR, DE FORMA A IDE"| __truncated__ "O PILOTO ERA POUCO EXPERIENTE E REALIZOU O POUSO SEM ANALISAR AS CONDIÇÕES DA ÁREA, DESCONSIDERANDO OS RISCOS E"| __truncated__ ...
## $ fator_dia_extracao : Date, format: "2019-04-22" "2019-04-22" ...
## - attr(*, "problems")=Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 5 variables:
## ..$ row : int 3362 3362
## ..$ col : chr "fator_detalhe_fator" "fator_detalhe_fator"
## ..$ expected: chr "delimiter or quote" "delimiter or quote"
## ..$ actual : chr "G" ")"
## ..$ file : chr "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv'" "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv'"
## - attr(*, "spec")=
## .. cols(
## .. codigo_ocorrencia = col_double(),
## .. fator_nome = col_character(),
## .. fator_aspecto = col_character(),
## .. fator_condicionante = col_character(),
## .. fator_area = col_character(),
## .. fator_detalhe_fator = col_character(),
## .. fator_dia_extracao = col_date(format = "")
## .. )
tbl_df(df_contribuintes)#Transformando algumas colunas para fatores
df_contribuintes$codigo_ocorrencia %<>% as.character()
df_contribuintes$fator_nome %<>% as.factor()
df_contribuintes$fator_aspecto %<>% as.factor()
df_contribuintes$fator_condicionante %<>% as.factor()
df_contribuintes$fator_area %<>% as.factor()
#Retirando colunas que a princípio não serão utilizadas
df_contribuintes$fator_dia_extracao <- NULL
df_contribuintes$fator_detalhe_fator <- NULL
str(df_contribuintes)## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 4536 obs. of 5 variables:
## $ codigo_ocorrencia : chr "200901015424167" "200901015424167" "200901015424167" "200901055963381" ...
## $ fator_nome : Factor w/ 68 levels "ÁLCOOL","ANSIEDADE",..: 41 44 66 5 57 6 18 3 40 41 ...
## $ fator_aspecto : Factor w/ 9 levels "ASPECTO DA FABRICAÇÃO",..: 6 6 6 5 5 5 5 6 6 6 ...
## $ fator_condicionante: Factor w/ 6 levels "INDIVIDUAL","MANUTENÇÃO DA AERONAVE",..: 3 2 3 1 1 4 4 3 3 3 ...
## $ fator_area : Factor w/ 3 levels "FATOR HUMANO",..: 3 3 3 1 1 1 1 3 3 3 ...
## - attr(*, "problems")=Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 5 variables:
## ..$ row : int 3362 3362
## ..$ col : chr "fator_detalhe_fator" "fator_detalhe_fator"
## ..$ expected: chr "delimiter or quote" "delimiter or quote"
## ..$ actual : chr "G" ")"
## ..$ file : chr "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv'" "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/ftc.csv'"
## - attr(*, "spec")=
## .. cols(
## .. codigo_ocorrencia = col_double(),
## .. fator_nome = col_character(),
## .. fator_aspecto = col_character(),
## .. fator_condicionante = col_character(),
## .. fator_area = col_character(),
## .. fator_detalhe_fator = col_character(),
## .. fator_dia_extracao = col_date(format = "")
## .. )
#Ilustrando a estrutura
str(df_recomendacoes)## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 2023 obs. of 10 variables:
## $ codigo_ocorrencia : num 2.01e+14 2.01e+14 2.01e+14 2.01e+14 2.01e+14 ...
## $ recomendacao_numero : chr "123/2012" "122/2012" "121/2012" "120/2012" ...
## $ recomendacao_dia_assinatura : Date, format: "2012-03-22" "2012-03-22" ...
## $ recomendacao_dia_encaminhamento: Date, format: "2012-04-20" "2012-04-20" ...
## $ recomendacao_feedback : Date, format: NA "2012-11-26" ...
## $ recomendacao_conteudo : chr "Dar ampla divulgação aos operadores de aeronaves antigas e clássicas, ainda em voo, do conteúdo do presente rel"| __truncated__ "Realizar fiscalização mais rigorosa na vistoria de documentação referente às aeronaves - cadernetas, fichas de "| __truncated__ "Aplicar processos que melhorem a qualidade da supervisão dos serviços prestados, de forma a impedir a emissão d"| __truncated__ "Promover a atualização de todos os registros das aeronaves operadas, conforme a legislação em vigor." ...
## $ recomendacao_status : chr "AGUARDANDO RESPOSTA" "CUMPRIDA" "AGUARDANDO RESPOSTA" "AGUARDANDO RESPOSTA" ...
## $ recomendacao_destinatario_sigla: chr "ABAAC" "ANAC" "AEROCAMP" "EXTREME" ...
## $ recomendacao_destinatario_nome : chr "ASSOCIAÇÃO BRASILEIRA DE AERONAVES ANTIGAS E CLÁSSICAS" "AGÊNCIA NACIONAL DE AVIAÇÃO CIVIL" "AEROCAMP COMÉRCIO E SERVIÇOS AERONÁUTICOS" "EXTREME DEMONSTRAÇÕES AÉREAS" ...
## $ dia_extracao_recomendacao : Date, format: "2019-04-22" "2019-04-22" ...
## - attr(*, "problems")=Classes 'tbl_df', 'tbl' and 'data.frame': 93 obs. of 5 variables:
## ..$ row : int 224 224 224 592 592 592 593 593 593 658 ...
## ..$ col : chr "recomendacao_conteudo" "recomendacao_conteudo" NA "recomendacao_conteudo" ...
## ..$ expected: chr "delimiter or quote" "delimiter or quote" "10 columns" "delimiter or quote" ...
## ..$ actual : chr "C" "*" "9 columns" "D" ...
## ..$ file : chr "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'" "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'" "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'" "'https://raw.githubusercontent.com/fariasjlf/opendata_aig_brazil/master/data/rec.csv'" ...
## - attr(*, "spec")=
## .. cols(
## .. codigo_ocorrencia = col_double(),
## .. recomendacao_numero = col_character(),
## .. recomendacao_dia_assinatura = col_date(format = ""),
## .. recomendacao_dia_encaminhamento = col_date(format = ""),
## .. recomendacao_feedback = col_date(format = ""),
## .. recomendacao_conteudo = col_character(),
## .. recomendacao_status = col_character(),
## .. recomendacao_destinatario_sigla = col_character(),
## .. recomendacao_destinatario_nome = col_character(),
## .. dia_extracao_recomendacao = col_date(format = "")
## .. )
head(df_recomendacoes, n = 5)3. Criando um único dataframe para o projeto
A partir das decisões tomadas na seção anterior, os dataframes df_ocorrencias, df_aeronaves e df_contribuintes, serão unificados em um só, para isso, utilizou-se a função merge duas vezes. A primeira para conectar df_ocorrencias e df_aeronaves, e a segunda para conectar df_aeronaves e df_contribuintes. Utilizando como base a coluna “codigo_ocorrencia” que está presente nos 3 data frames. Para não perder nenhum dado, foi considerada a tabela com maior quantidade de linhas, no primeiro código representado por “all.y = T” e no segundo por “all.x = T”. Após o merge foi gerado um arquivo “.csv”.
df_projeto <- merge(df_ocorrencias, df_aeronaves, by.x = "codigo_ocorrencia", by.y = "codigo_ocorrencia", all.y = T)
df_projetofinal <- merge(df_projeto, df_contribuintes, by.x = "codigo_ocorrencia", by.y = "codigo_ocorrencia", all.x = T)
str(df_projetofinal)## 'data.frame': 8911 obs. of 38 variables:
## $ codigo_ocorrencia : chr "200901015424167" "200901015424167" "200901015424167" "200901022242090" ...
## $ ocorrencia_classificacao : Factor w/ 3 levels "ACIDENTE","INCIDENTE",..: 1 1 1 2 2 2 2 2 2 2 ...
## $ ocorrencia_tipo : Factor w/ 70 levels "AERÓDROMO","AERONAVE ATINGIDA POR OBJETO",..: 32 32 32 13 22 35 11 4 32 29 ...
## $ ocorrencia_tipo_categoria : Factor w/ 31 levels "AERÓDROMO","COLISÃO COM AVE",..: 13 13 13 5 11 12 5 24 13 11 ...
## $ ocorrencia_tipo_icao : Factor w/ 29 levels "ADRM","AMAN",..: 22 22 22 10 21 21 10 17 22 21 ...
## $ ocorrencia_latitude : num -23.57 -23.57 -23.57 -23.47 -3.39 ...
## $ ocorrencia_longitude : num -46.3 -46.3 -46.3 -46.5 -57.7 ...
## $ ocorrencia_cidade : Factor w/ 1044 levels "ABADIA DE GOIÁS",..: 606 606 606 401 596 625 524 150 992 98 ...
## $ ocorrencia_uf : Factor w/ 27 levels "AC","AL","AM",..: 26 26 26 26 3 24 11 7 12 3 ...
## $ ocorrencia_aerodromo : Factor w/ 473 levels "5JTI","9PAA",..: NA NA NA 45 NA 78 56 17 NA 413 ...
## $ ocorrencia_dia : Date, format: "2009-01-01" "2009-01-01" ...
## $ ocorrencia_ano : chr "2009" "2009" "2009" "2009" ...
## $ ocorrencia_horario : 'hms' num 15:35:00 15:35:00 15:35:00 13:30:00 ...
## ..- attr(*, "units")= chr "secs"
## $ total_recomendacoes : num 6 6 6 0 0 0 0 0 0 0 ...
## $ total_aeronaves_envolvidas : num 1 1 1 1 1 1 1 1 1 1 ...
## $ ocorrencia_saida_pista : Factor w/ 2 levels "NÃO","SIM": 1 1 1 1 1 1 2 1 1 1 ...
## $ aeronave_operador_categoria: Factor w/ 6 levels "AEROCLUBE","ESCOLA DE AVIAÇÃO",..: 4 4 4 4 4 4 1 4 4 4 ...
## $ aeronave_tipo_veiculo : Factor w/ 10 levels "ANFÍBIO","AVIÃO",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ aeronave_fabricante : Factor w/ 224 levels " DASSAULT AVIATION",..: 160 160 160 15 69 15 2 15 69 69 ...
## $ aeronave_modelo : Factor w/ 778 levels " A320-214","108-2",..: 307 307 307 240 455 239 267 243 456 417 ...
## $ aeronave_tipo_icao : Factor w/ 233 levels " B734","734",..: 229 229 229 11 200 10 17 11 200 124 ...
## $ aeronave_motor_tipo : Factor w/ 5 levels "JATO","PISTÃO",..: 2 2 2 1 2 1 2 1 2 5 ...
## $ aeronave_motor_quantidade : Factor w/ 5 levels "BIMOTOR","MONOMOTOR",..: 2 2 2 1 1 1 2 1 1 1 ...
## $ aeronave_pmd : num 2404 2404 2404 77000 2073 ...
## $ aeronave_pmd_categoria : Factor w/ 3 levels "ACIMA DE 5700 KG",..: 3 3 3 1 2 1 2 1 2 3 ...
## $ aeronave_assentos : num 2 2 2 184 7 154 2 166 7 21 ...
## $ aeronave_ano_fabricacao : Factor w/ 77 levels "0","1936","1940",..: 4 4 4 68 39 59 52 66 45 40 ...
## $ aeronave_pais_fabricante : Factor w/ 16 levels "ALEMANHA","ARGENTINA",..: 6 6 6 7 4 7 2 7 4 4 ...
## $ aeronave_pais_registro : chr "BRASIL" "BRASIL" "BRASIL" "BRASIL" ...
## $ aeronave_registro_segmento : Factor w/ 12 levels "ADMINISTRAÇÃO DIRETA",..: 4 4 4 11 12 11 7 11 12 11 ...
## $ aeronave_fase_operacao : Factor w/ 31 levels "APROXIMAÇÃO FINAL",..: 14 14 14 21 25 30 8 7 7 6 ...
## $ aeronave_tipo_operacao : Factor w/ 10 levels "INDETERMINADA",..: 3 3 3 10 5 10 6 10 5 10 ...
## $ aeronave_nivel_dano : Factor w/ 5 levels "DESTRUÍDA","INDETERMINADO",..: 5 5 5 3 3 4 3 4 4 3 ...
## $ total_fatalidades : num 0 0 0 0 0 0 0 0 0 0 ...
## $ fator_nome : Factor w/ 68 levels "ÁLCOOL","ANSIEDADE",..: 44 66 41 NA NA NA NA NA NA NA ...
## $ fator_aspecto : Factor w/ 9 levels "ASPECTO DA FABRICAÇÃO",..: 6 6 6 NA NA NA NA NA NA NA ...
## $ fator_condicionante : Factor w/ 6 levels "INDIVIDUAL","MANUTENÇÃO DA AERONAVE",..: 2 3 3 NA NA NA NA NA NA NA ...
## $ fator_area : Factor w/ 3 levels "FATOR HUMANO",..: 3 3 3 NA NA NA NA NA NA NA ...
view(df_projetofinal)
# Para gerar o arquivo ".csv" basta tirar a "#" do código abaixo.
#write.csv(df_projetofinal, "df_projetofinal.csv")4. Gerando análises a partir do data frame do projeto
Primeiramente, foi feita a contagem do número de ocorrências aéreas nos últimos 10 anos com o objetivo de identificar a amplitude de dados que serão analisados.
# Total de ocorrências aéreas nos últimos 10 anos em solo brasileiro:
total_de_ocorrencias <-
df_projetofinal %>%
count(codigo_ocorrencia) %>%
nrow()
paste0("Nos últimos dez anos o total de ocorrencias aéreas é de ", total_de_ocorrencias,".")## [1] "Nos últimos dez anos o total de ocorrencias aéreas é de 5396."
Uma vez identificado o número total de ocorrências, tentou-se entender como elas estão distribuidas pelo territorio brasileiro. Com esse fim, foi gerado um mapa interativo onde pode-se observar a quantidade de ocorrências em cada um dos estados do Brasil, bastando apenas passar o cursor do mouse no estado desejado. Além disso, o esquema de cores nos mostra, de acordo com a tonalidade, os estados com o maior número de ocorrências aéreas.
# O if abaixo foi adicionado para não ser necessário baixar os arquivos novamente ao rodar o código mais de uma vez.
if(!exists("shp")){
download.file("http://www.usp.br/nereus/wp-content/uploads/Brasil.zip",destfile="br_unidades_da_federacao.zip")
unzip("br_unidades_da_federacao.zip")
shp <- rgdal::readOGR(getwd(),"UFEBRASIL", stringsAsFactors=FALSE, encoding="UTF-8")
}## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\Breno\Documents\Faculdade\1- UERJ\9º Período\Tecnologia da Informação\Projeto\Ocorrências Aeronáuticas na Aviação Civil Brasileira\R", layer: "UFEBRASIL"
## with 27 features
## It has 4 fields
## Integer64 fields read as strings: ID
dados_mapa <- df_projetofinal %>%
tidyr::complete(ocorrencia_uf) %>%
group_by(ocorrencia_uf) %>%
summarize('Numero' = n(), na.rm = TRUE) %>%
arrange(desc(Numero), ocorrencia_uf) %>%
select(ocorrencia_uf, Numero)## Warning: Factor `ocorrencia_uf` contains implicit NA, consider using
## `forcats::fct_explicit_na`
url <- "https://www.oobj.com.br/bc/article/quais-os-c%C3%B3digos-de-cada-uf-no-brasil-465.html"
ID_UF <- url %>%
read_html() %>%
html_nodes("table") %>%
html_table()
dados_mapa <- merge(dados_mapa,ID_UF, by.x = "ocorrencia_uf", by.y = "UF")
dados_mapa <- dados_mapa %>%
select(Código.UF, ocorrencia_uf, Numero)
mapa <- merge(shp,dados_mapa, by.x = "CD_GEOCODU", by.y = "Código.UF")
# Criação do mapa
bins <- c(0, 50, 100, 200, 500, 1000, 2000)
pal <- colorBin("Greens", domain = mapa$Numero, bins = bins)
labels <- sprintf(
"<strong>%s</strong><br/>%g ocorrências",
mapa$NM_ESTADO, mapa$Numero
) %>% lapply(htmltools::HTML)
leaflet(mapa) %>%
addTiles() %>%
addPolygons(fillColor = ~pal(mapa$Numero),
weight = 0.5,
opacity = 1,
color = "gray",
dashArray = "3",
fillOpacity = 0.9,
highlight = highlightOptions(weight = 3,
color = "#666",
dashArray = "",
fillOpacity = 0.7,
bringToFront = TRUE),
label = labels,
labelOptions = labelOptions(style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend(pal = pal, values = ~mapa$Numero, opacity = 0.9,
title = "Número de ocorrências", position = "bottomright")